const { log } = require('node:console')
const crypto = require('node:crypto')
/** 
 *  对称加密
 *  双方协商定义一个密钥以及iv
 * */
/**
 * 第一个参数：algorithm 接收一个算法 aes-256-cbc
 * 第二个参数：key 也就是密钥 32位
 * 第三个参数：iv 初始化向量 支持 16位  保证生成密钥串每次是不一样的 密钥串缺少位数还可以进行补码
 */
const key = crypto.randomBytes(32)
const iv = Buffer.from(crypto.randomBytes(16))
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv)
cipher.update('ws-js', 'utf-8', 'hex')
const result = cipher.final('hex')  // 输出密文 16 进制
console.log(result)
// 解密 相同的算法 相同的 key 相同的 iv 
const de = crypto.createDecipheriv('aes-256-cbc', key, iv)
de.update(result, 'hex', 'utf-8')
const res = de.final('utf-8')
console.log(res)

/**
 * 非对称加密
 * 生成公钥和私钥
 * 私钥只能管理员拥有 不能对外公开
 * 公钥可以对外公开
 */

const { privateKey, publicKey } = crypto.generateKeyPairSync('rsa', {
    modulusLength: 2048,  // 长度越长越安全 越慢
    publicKeyEncoding: {
        type: 'spki',
        format: 'pem'
    },
    privateKeyEncoding: {
        type: 'pkcs8',
        format: 'pem'
    }
})
// 公钥 加密
const encrypted = crypto.publicEncrypt(publicKey, Buffer.from('ws-js'))
console.log('encrypted', encrypted.toString('hex'))
// 私钥 解密
const decrypted = crypto.privateDecrypt(privateKey, encrypted)
console.log('decrypted', decrypted.toString('utf-8'))

/**
 * 哈希函数
 * 不能被解密 因为他是单项的 不可逆的
 * 不是很安全 具有唯一性
 * 密码等隐私信息 MD5 包裹存储到数据库 不可能明文存储
 * 可以撞库 碰密码解密
 * 
 * 校验文件一致性：读取文件内容 转换成 MD5 上传给服务端，后端拿到文件内容生产 MD5跟前端MD5匹配 如果一致没问题  如果不一致文件有问题
 * 
 */
const hash = crypto.createHash('sha256')  // md5
// const hash = crypto.createHash('md5')  // md5
// hash.update('ws-js')
hash.update('123456')
console.log(hash.digest('hex'))